<#include "EntityCommonVisit.ftl">
package ${packageName};

import cn.pink.core.Port;
import cn.pink.core.gen.IronGenFile;
import cn.pink.core.entity.EntityBase;
import cn.pink.core.support.Log;
import cn.pink.core.support.SysException;
import cn.pink.core.db.DBConst;
import cn.pink.core.Record;

import org.apache.commons.lang3.exception.ExceptionUtils;

import java.util.*;

@IronGenFile
public final class ${entityName} extends EntityBase {
	
	public static final String tableName = "${tableName?lower_case}";

	@Override
	public String getTableName() {
		return tableName;
	}
	
	public ${entityName}() {
		super();
	<#list fields as field>
		<#if field.defaults??>
			<#if field.type == "String">
		set${field.name?cap_first}("${field.defaults}");
			<#else>
		set${field.name?cap_first}(${field.defaults});
			</#if>
		</#if>
	</#list>
	}

	public ${entityName}(Record record) {
		super(record);
	<#list fields as field>
		<#if field.isTransient>
		<#if field.defaults??>
			<#if field.type == "String">
		set${field.name?cap_first}("${field.defaults}");
			<#else>
		set${field.name?cap_first}(${field.defaults});
			</#if>
		</#if>
		</#if>
	</#list>
	}

	/**
	 * 新增数据
	 */
	@Override
	public void persist() {
		// 状态错误
		if (record.getStatus() != DBConst.RECORD_STATUS_NEW) {
			Log.db.error("只有新增包能调用persist函数，请确认状态：data={}, stackTrace={}", this, ExceptionUtils.getStackTrace(new Throwable()));
			return;
		}
		
		DB prx = DB.newInstance(getTableName());
		prx.insert(record);
		
		// 重置状态
		record.resetStatus();
	}

	/**
	 * 同步修改数据至DB服务器
	 * 默认不立即持久化到数据库
	 */
	@Override
	public void update() {
		update(false);
	}
	
	/**
	 * 同步修改数据至DB服务器
	 * @param sync 是否立即同持久化到数据库
	 */
	@Override
	public void update(boolean sync) {
		// 新增包不能直接调用update函数 请先调用persist
		if (record.getStatus() == DBConst.RECORD_STATUS_NEW) {
			throw new SysException("新增包不能直接调用update函数，请先调用persist：data={}", this);
		}
		
		// 升级包
		try(OutputStream patch = record.patchUpdateGen()) {
			if (patch == null || patch.getLength() == 0) {
				return;
			}
	
			// 将升级包同步至DB服务器
			DB prx = DB.newInstance(getTableName());
			prx.update(getId(), patch.getChunk(), sync);
		}
		
		// 重置状态
		record.resetStatus();
	}

	/**
	 * 删除数据
	 */
	@Override
	public void remove() {
		// 新建的记录，尚未存盘，直接返回
		if (record.getStatus() == DBConst.RECORD_STATUS_NEW) {
			return;
		}
		
		DB prx = DB.newInstance(getTableName());
		prx.delete(getId());
	}

	<#-- get和set方法 -->
	<@getAndSetField fields=fields/>

}